import java.io.IOException;
import java.util.*;

class Search {

    static HashMap<Character, Character> vagueMatchMap = new HashMap<>();   //模糊匹配表

    static{ //初始化模糊匹配表
        vagueMatchMap.put('1', '一');
        vagueMatchMap.put('2', '二');
        vagueMatchMap.put('3', '三');
        vagueMatchMap.put('4', '四');
        vagueMatchMap.put('5', '五');
        vagueMatchMap.put('6', '六');
        vagueMatchMap.put('7', '七');
        vagueMatchMap.put('8', '八');
        vagueMatchMap.put('9', '九');

        vagueMatchMap.put('一', '1');
        vagueMatchMap.put('二', '2');
        vagueMatchMap.put('三', '3');
        vagueMatchMap.put('四', '4');
        vagueMatchMap.put('五', '5');
        vagueMatchMap.put('六', '6');
        vagueMatchMap.put('七', '7');
        vagueMatchMap.put('八', '8');
        vagueMatchMap.put('九', '9');

        vagueMatchMap.put('a', 'A');
        vagueMatchMap.put('b', 'B');
        vagueMatchMap.put('c', 'C');
        vagueMatchMap.put('d', 'D');
        vagueMatchMap.put('e', 'E');
        vagueMatchMap.put('f', 'F');
        vagueMatchMap.put('g', 'G');
        vagueMatchMap.put('h', 'H');
        vagueMatchMap.put('i', 'I');
        vagueMatchMap.put('j', 'J');
        vagueMatchMap.put('k', 'K');
        vagueMatchMap.put('l', 'L');
        vagueMatchMap.put('m', 'M');
        vagueMatchMap.put('n', 'N');
        vagueMatchMap.put('o', 'O');
        vagueMatchMap.put('p', 'P');
        vagueMatchMap.put('q', 'Q');
        vagueMatchMap.put('r', 'R');
        vagueMatchMap.put('s', 'S');
        vagueMatchMap.put('t', 'T');
        vagueMatchMap.put('u', 'U');
        vagueMatchMap.put('v', 'V');
        vagueMatchMap.put('w', 'W');
        vagueMatchMap.put('x', 'X');
        vagueMatchMap.put('y', 'Y');
        vagueMatchMap.put('z', 'Z');

        vagueMatchMap.put('A', 'a');
        vagueMatchMap.put('B', 'b');
        vagueMatchMap.put('C', 'c');
        vagueMatchMap.put('D', 'd');
        vagueMatchMap.put('E', 'e');
        vagueMatchMap.put('F', 'f');
        vagueMatchMap.put('G', 'g');
        vagueMatchMap.put('H', 'h');
        vagueMatchMap.put('I', 'i');
        vagueMatchMap.put('J', 'j');
        vagueMatchMap.put('K', 'k');
        vagueMatchMap.put('L', 'l');
        vagueMatchMap.put('M', 'm');
        vagueMatchMap.put('N', 'n');
        vagueMatchMap.put('O', 'o');
        vagueMatchMap.put('P', 'p');
        vagueMatchMap.put('Q', 'q');
        vagueMatchMap.put('R', 'r');
        vagueMatchMap.put('S', 's');
        vagueMatchMap.put('T', 't');
        vagueMatchMap.put('U', 'u');
        vagueMatchMap.put('V', 'v');
        vagueMatchMap.put('W', 'w');
        vagueMatchMap.put('X', 'x');
        vagueMatchMap.put('Y', 'y');
        vagueMatchMap.put('Z', 'z');

        vagueMatchMap.put('(', '（');
        vagueMatchMap.put(')', '）');
        vagueMatchMap.put('（', '(');
        vagueMatchMap.put('）', ')');
    }

    public static myEdge FindPath(int start, int end){  //返回起点为start,终点为end的边对象

        for(myEdge e:Input.edges)
            if(e.Start == start && e.End == end) return e;
        return null;
    }

    public static Boolean strcmp(String src, String dst){   //字符串匹配,只要dst中按顺序包含src中的所有字符(含模糊)即可

        int cnt = 0;

        for (int i = 0; i < dst.length(); i++){

            if (src.charAt(cnt) == dst.charAt(i)) cnt++;
            else if (vagueMatchMap.containsKey(src.charAt(cnt)) && (vagueMatchMap.get(src.charAt(cnt)) == dst.charAt(i))) cnt++;

            if (cnt == src.length()) return true;
        }
        return false;
    }

    public static ArrayList<Building> searchBuilding(String name){  //对建筑名单中的所有建筑进行对name的匹配,并返回查找结果

        ArrayList<Building> arrs = new ArrayList<>();

        for (Building building:Input.buildings)
            if (strcmp(name, building.Building_Name)) arrs.add(building);

        return arrs;
    }

    /*读入name,进行查找,若没有对应建筑则查找设施,构造匹配到的建筑列表或包含所查询设施的建筑列表*/
    public static void getStart_End() throws IOException {

        Scanner in = new Scanner(System.in);
        String name = in.next();
        fileOutput.Cacheln(false, name);

        Navigation.resultList = Search.searchBuilding(name);

        if (Navigation.resultList.isEmpty()) {
            fileOutput.Cacheln(true, "未查询到建筑，正在查询设施");

            Iterator iter = Navigation.DevicesMap.entrySet().iterator();    //使用迭代器迭代Map

            while (iter.hasNext()) {

                Map.Entry entry = (Map.Entry) iter.next();
                String key = (String)entry.getKey();
                ArrayList<Building> value = (ArrayList) entry.getValue();

                if (strcmp(name, key)) {
                    Navigation.resultList = value;
                    break;
                }
            }
        }

        if (Navigation.resultList.isEmpty()) fileOutput.Cacheln(true, "未查询到设施！");
        else for (int i = 0; i < Navigation.resultList.size(); i++)
            fileOutput.Cacheln(true, i + ":" + Navigation.resultList.get(i).Building_Name);
    }
}
